package top.lishuoboy.boot09profile.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RestController;
import top.lishuoboy.boot09profile.bean.Car;
import top.lishuoboy.boot09profile.bean.Person;
import top.lishuoboy.boot09profile.service.Animal;

/**
 * 高级特性-Profile环境切换
 * 为了方便多环境适配，Spring Boot简化了profile功能。
 *
 * ● 默认配置文件application.yaml任何时候都会加载。
 * ● 指定环境配置文件application-{env}.yaml，env通常替代为test，
 * ● 激活指定环境
 * 1)配置文件激活：spring.profiles.active=prod
 * 2)命令行激活：java -jar xxx.jar --spring.profiles.active=prod --person.name=haha（修改配置文件的任意值，命令行优先）
 * ● 默认配置与环境配置同时生效
 * ● 同名配置项，profile配置优先
 *
 * 【配置文件加载顺序、优先级】
 * 1、外部配置源
 * 常用：Java属性文件、YAML文件、环境变量、命令行参数；
 *
 * 2、配置文件查找位置
 * (1) classpath 根路径
 * (2) classpath 根路径下config目录
 * (3) jar包当前目录
 * (4) jar包当前目录的config目录
 * (5) /config子目录的直接子目录
 *
 * 3、配置文件加载顺序：
 * (1) 当前jar包内部的application.properties和application.yml
 * (2) 当前jar包内部的application-{profile}.properties 和 application-{profile}.yml
 * (3) 引用的外部jar包的application.properties和application.yml
 * (4) 引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml
 *
 * 4、指定环境优先，外部优先，后面的可以覆盖前面的同名配置项
 * java -jar boot09-profile.jar
 * java -jar boot09-profile.jar --spring.profiles.active=test --server.port=8081
 * java -jar boot09-profile.jar --spring.profiles.active=prod --server.port=8082
 *
 * @author lishuoboy
 * @date 2022/2/28 11:04
 */

@Slf4j
@EnableScheduling
@RestController
public class ProfileController {
    @Autowired
    private Person person;
    @Autowired(required = false)
    private Car car;

    @Autowired
    @Qualifier("animal")
    private Animal animal;

    @Scheduled(fixedRate = 2 * 1000)
    private void profile() {
        log.warn("{}, {}", person, car);
        log.warn("animal=={}", animal.getClass());
    }
}
